package net.maku.framework.common.xss;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.safety.Safelist;

/**
 * XSS 过滤工具类
 *
 * @author 阿沐 babamu@126.com
 * <a href="https://maku.net">MAKU</a>
 */
public class XssUtils {
    /**
     * 不格式化
     */
    private final static Document.OutputSettings outputSettings = new Document.OutputSettings().prettyPrint(false);

    /**
     * XSS过滤
     *
     * @return 返回过滤后的内容
     */
    public static String filter(String value) {
        if (value == null || value.isEmpty()) {
            return value;
        }

        // 使用 Jsoup 的 Safelist.relaxed()，允许大部分文本格式化标签
        Safelist safelist = Safelist.relaxed();

        // 允许更多常用标签
        safelist.addTags("div", "span", "img", "table", "thead", "tbody", "tfoot", "th", "td", "tr", "u", "s", "iframe", "video", "audio", "source");

        // 允许所有标签上的 style, class, id, src, href 属性
        safelist.addAttributes(":all", "style", "class", "id", "src", "href", "title", "alt", "width", "height", "controls", "poster");

        // 移除所有事件属性 (onXXX) 和 javascript: 协议
        safelist.addProtocols("a", "href", "http", "https", "mailto"); // 限制 a 标签 href 协议

        // 输出为不格式化 HTML（保留换行等）
        return Jsoup.clean(value, "", safelist, new org.jsoup.nodes.Document.OutputSettings().prettyPrint(false));
    }

    public static String filterContent(String value) {
        if (value == null || value.isEmpty()) {
            return value;
        }

        // 宽松白名单，允许大部分 HTML 标签
        Safelist safelist = Safelist.relaxed();

        // 扩展标签
        safelist.addTags(
                "div", "span", "img", "table", "thead", "tbody", "tfoot", "th", "td", "tr",
                "u", "s", "iframe", "video", "audio", "source", "blockquote", "pre", "code", "br", "p", "h1", "h2", "h3", "h4", "h5", "h6"
        );

        // 扩展属性
        safelist.addAttributes(":all",
                "style", "class", "id", "src", "href", "title", "alt",
                "width", "height", "controls", "poster", "data-*"
        );

        // 允许 a 标签 href 协议
        safelist.addProtocols("a", "href", "http", "https", "mailto");

        // 输出不格式化
        return Jsoup.clean(value, "", safelist, outputSettings);
    }


}